home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / include / linux / firewire-cdev.h < prev    next >
C/C++ Source or Header  |  2009-10-16  |  25KB  |  635 lines

  1. /*
  2.  * Char device interface.
  3.  *
  4.  * Copyright (C) 2005-2006  Kristian Hoegsberg <krh@bitplanet.net>
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License as published by
  8.  * the Free Software Foundation; either version 2 of the License, or
  9.  * (at your option) any later version.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program; if not, write to the Free Software Foundation,
  18.  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  19.  */
  20.  
  21. #ifndef _LINUX_FIREWIRE_CDEV_H
  22. #define _LINUX_FIREWIRE_CDEV_H
  23.  
  24. #include <linux/ioctl.h>
  25. #include <linux/types.h>
  26. #include <linux/firewire-constants.h>
  27.  
  28. #define FW_CDEV_EVENT_BUS_RESET            0x00
  29. #define FW_CDEV_EVENT_RESPONSE            0x01
  30. #define FW_CDEV_EVENT_REQUEST            0x02
  31. #define FW_CDEV_EVENT_ISO_INTERRUPT        0x03
  32. #define FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED    0x04
  33. #define FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED    0x05
  34.  
  35. /**
  36.  * struct fw_cdev_event_common - Common part of all fw_cdev_event_ types
  37.  * @closure:    For arbitrary use by userspace
  38.  * @type:    Discriminates the fw_cdev_event_ types
  39.  *
  40.  * This struct may be used to access generic members of all fw_cdev_event_
  41.  * types regardless of the specific type.
  42.  *
  43.  * Data passed in the @closure field for a request will be returned in the
  44.  * corresponding event.  It is big enough to hold a pointer on all platforms.
  45.  * The ioctl used to set @closure depends on the @type of event.
  46.  */
  47. struct fw_cdev_event_common {
  48.     __u64 closure;
  49.     __u32 type;
  50. };
  51.  
  52. /**
  53.  * struct fw_cdev_event_bus_reset - Sent when a bus reset occurred
  54.  * @closure:    See &fw_cdev_event_common; set by %FW_CDEV_IOC_GET_INFO ioctl
  55.  * @type:    See &fw_cdev_event_common; always %FW_CDEV_EVENT_BUS_RESET
  56.  * @node_id:       New node ID of this node
  57.  * @local_node_id: Node ID of the local node, i.e. of the controller
  58.  * @bm_node_id:    Node ID of the bus manager
  59.  * @irm_node_id:   Node ID of the iso resource manager
  60.  * @root_node_id:  Node ID of the root node
  61.  * @generation:    New bus generation
  62.  *
  63.  * This event is sent when the bus the device belongs to goes through a bus
  64.  * reset.  It provides information about the new bus configuration, such as
  65.  * new node ID for this device, new root ID, and others.
  66.  */
  67. struct fw_cdev_event_bus_reset {
  68.     __u64 closure;
  69.     __u32 type;
  70.     __u32 node_id;
  71.     __u32 local_node_id;
  72.     __u32 bm_node_id;
  73.     __u32 irm_node_id;
  74.     __u32 root_node_id;
  75.     __u32 generation;
  76. };
  77.  
  78. /**
  79.  * struct fw_cdev_event_response - Sent when a response packet was received
  80.  * @closure:    See &fw_cdev_event_common;
  81.  *        set by %FW_CDEV_IOC_SEND_REQUEST ioctl
  82.  * @type:    See &fw_cdev_event_common; always %FW_CDEV_EVENT_RESPONSE
  83.  * @rcode:    Response code returned by the remote node
  84.  * @length:    Data length, i.e. the response's payload size in bytes
  85.  * @data:    Payload data, if any
  86.  *
  87.  * This event is sent when the stack receives a response to an outgoing request
  88.  * sent by %FW_CDEV_IOC_SEND_REQUEST ioctl.  The payload data for responses
  89.  * carrying data (read and lock responses) follows immediately and can be
  90.  * accessed through the @data field.
  91.  */
  92. struct fw_cdev_event_response {
  93.     __u64 closure;
  94.     __u32 type;
  95.     __u32 rcode;
  96.     __u32 length;
  97.     __u32 data[0];
  98. };
  99.  
  100. /**
  101.  * struct fw_cdev_event_request - Sent on incoming request to an address region
  102.  * @closure:    See &fw_cdev_event_common; set by %FW_CDEV_IOC_ALLOCATE ioctl
  103.  * @type:    See &fw_cdev_event_common; always %FW_CDEV_EVENT_REQUEST
  104.  * @tcode:    Transaction code of the incoming request
  105.  * @offset:    The offset into the 48-bit per-node address space
  106.  * @handle:    Reference to the kernel-side pending request
  107.  * @length:    Data length, i.e. the request's payload size in bytes
  108.  * @data:    Incoming data, if any
  109.  *
  110.  * This event is sent when the stack receives an incoming request to an address
  111.  * region registered using the %FW_CDEV_IOC_ALLOCATE ioctl.  The request is
  112.  * guaranteed to be completely contained in the specified region.  Userspace is
  113.  * responsible for sending the response by %FW_CDEV_IOC_SEND_RESPONSE ioctl,
  114.  * using the same @handle.
  115.  *
  116.  * The payload data for requests carrying data (write and lock requests)
  117.  * follows immediately and can be accessed through the @data field.
  118.  */
  119. struct fw_cdev_event_request {
  120.     __u64 closure;
  121.     __u32 type;
  122.     __u32 tcode;
  123.     __u64 offset;
  124.     __u32 handle;
  125.     __u32 length;
  126.     __u32 data[0];
  127. };
  128.  
  129. /**
  130.  * struct fw_cdev_event_iso_interrupt - Sent when an iso packet was completed
  131.  * @closure:    See &fw_cdev_event_common;
  132.  *        set by %FW_CDEV_CREATE_ISO_CONTEXT ioctl
  133.  * @type:    See &fw_cdev_event_common; always %FW_CDEV_EVENT_ISO_INTERRUPT
  134.  * @cycle:    Cycle counter of the interrupt packet
  135.  * @header_length: Total length of following headers, in bytes
  136.  * @header:    Stripped headers, if any
  137.  *
  138.  * This event is sent when the controller has completed an &fw_cdev_iso_packet
  139.  * with the %FW_CDEV_ISO_INTERRUPT bit set.  In the receive case, the headers
  140.  * stripped of all packets up until and including the interrupt packet are
  141.  * returned in the @header field.  The amount of header data per packet is as
  142.  * specified at iso context creation by &fw_cdev_create_iso_context.header_size.
  143.  *
  144.  * In version 1 of this ABI, header data consisted of the 1394 isochronous
  145.  * packet header, followed by quadlets from the packet payload if
  146.  * &fw_cdev_create_iso_context.header_size > 4.
  147.  *
  148.  * In version 2 of this ABI, header data consist of the 1394 isochronous
  149.  * packet header, followed by a timestamp quadlet if
  150.  * &fw_cdev_create_iso_context.header_size > 4, followed by quadlets from the
  151.  * packet payload if &fw_cdev_create_iso_context.header_size > 8.
  152.  *
  153.  * Behaviour of ver. 1 of this ABI is no longer available since ABI ver. 2.
  154.  *
  155.  * Format of 1394 iso packet header: 16 bits len, 2 bits tag, 6 bits channel,
  156.  * 4 bits tcode, 4 bits sy, in big endian byte order.  Format of timestamp:
  157.  * 16 bits invalid, 3 bits cycleSeconds, 13 bits cycleCount, in big endian byte
  158.  * order.
  159.  */
  160. struct fw_cdev_event_iso_interrupt {
  161.     __u64 closure;
  162.     __u32 type;
  163.     __u32 cycle;
  164.     __u32 header_length;
  165.     __u32 header[0];
  166. };
  167.  
  168. /**
  169.  * struct fw_cdev_event_iso_resource - Iso resources were allocated or freed
  170.  * @closure:    See &fw_cdev_event_common;
  171.  *        set by %FW_CDEV_IOC_(DE)ALLOCATE_ISO_RESOURCE(_ONCE) ioctl
  172.  * @type:    %FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED or
  173.  *        %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED
  174.  * @handle:    Reference by which an allocated resource can be deallocated
  175.  * @channel:    Isochronous channel which was (de)allocated, if any
  176.  * @bandwidth:    Bandwidth allocation units which were (de)allocated, if any
  177.  *
  178.  * An %FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED event is sent after an isochronous
  179.  * resource was allocated at the IRM.  The client has to check @channel and
  180.  * @bandwidth for whether the allocation actually succeeded.
  181.  *
  182.  * An %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED event is sent after an isochronous
  183.  * resource was deallocated at the IRM.  It is also sent when automatic
  184.  * reallocation after a bus reset failed.
  185.  *
  186.  * @channel is <0 if no channel was (de)allocated or if reallocation failed.
  187.  * @bandwidth is 0 if no bandwidth was (de)allocated or if reallocation failed.
  188.  */
  189. struct fw_cdev_event_iso_resource {
  190.     __u64 closure;
  191.     __u32 type;
  192.     __u32 handle;
  193.     __s32 channel;
  194.     __s32 bandwidth;
  195. };
  196.  
  197. /**
  198.  * union fw_cdev_event - Convenience union of fw_cdev_event_ types
  199.  * @common:        Valid for all types
  200.  * @bus_reset:     Valid if @common.type == %FW_CDEV_EVENT_BUS_RESET
  201.  * @response:      Valid if @common.type == %FW_CDEV_EVENT_RESPONSE
  202.  * @request:       Valid if @common.type == %FW_CDEV_EVENT_REQUEST
  203.  * @iso_interrupt: Valid if @common.type == %FW_CDEV_EVENT_ISO_INTERRUPT
  204.  * @iso_resource:  Valid if @common.type ==
  205.  *                %FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED or
  206.  *                %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED
  207.  *
  208.  * Convenience union for userspace use.  Events could be read(2) into an
  209.  * appropriately aligned char buffer and then cast to this union for further
  210.  * processing.  Note that for a request, response or iso_interrupt event,
  211.  * the data[] or header[] may make the size of the full event larger than
  212.  * sizeof(union fw_cdev_event).  Also note that if you attempt to read(2)
  213.  * an event into a buffer that is not large enough for it, the data that does
  214.  * not fit will be discarded so that the next read(2) will return a new event.
  215.  */
  216. union fw_cdev_event {
  217.     struct fw_cdev_event_common        common;
  218.     struct fw_cdev_event_bus_reset        bus_reset;
  219.     struct fw_cdev_event_response        response;
  220.     struct fw_cdev_event_request        request;
  221.     struct fw_cdev_event_iso_interrupt    iso_interrupt;
  222.     struct fw_cdev_event_iso_resource    iso_resource;
  223. };
  224.  
  225. /* available since kernel version 2.6.22 */
  226. #define FW_CDEV_IOC_GET_INFO           _IOWR('#', 0x00, struct fw_cdev_get_info)
  227. #define FW_CDEV_IOC_SEND_REQUEST        _IOW('#', 0x01, struct fw_cdev_send_request)
  228. #define FW_CDEV_IOC_ALLOCATE           _IOWR('#', 0x02, struct fw_cdev_allocate)
  229. #define FW_CDEV_IOC_DEALLOCATE          _IOW('#', 0x03, struct fw_cdev_deallocate)
  230. #define FW_CDEV_IOC_SEND_RESPONSE       _IOW('#', 0x04, struct fw_cdev_send_response)
  231. #define FW_CDEV_IOC_INITIATE_BUS_RESET  _IOW('#', 0x05, struct fw_cdev_initiate_bus_reset)
  232. #define FW_CDEV_IOC_ADD_DESCRIPTOR     _IOWR('#', 0x06, struct fw_cdev_add_descriptor)
  233. #define FW_CDEV_IOC_REMOVE_DESCRIPTOR   _IOW('#', 0x07, struct fw_cdev_remove_descriptor)
  234. #define FW_CDEV_IOC_CREATE_ISO_CONTEXT _IOWR('#', 0x08, struct fw_cdev_create_iso_context)
  235. #define FW_CDEV_IOC_QUEUE_ISO          _IOWR('#', 0x09, struct fw_cdev_queue_iso)
  236. #define FW_CDEV_IOC_START_ISO           _IOW('#', 0x0a, struct fw_cdev_start_iso)
  237. #define FW_CDEV_IOC_STOP_ISO            _IOW('#', 0x0b, struct fw_cdev_stop_iso)
  238.  
  239. /* available since kernel version 2.6.24 */
  240. #define FW_CDEV_IOC_GET_CYCLE_TIMER     _IOR('#', 0x0c, struct fw_cdev_get_cycle_timer)
  241.  
  242. /* available since kernel version 2.6.30 */
  243. #define FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE       _IOWR('#', 0x0d, struct fw_cdev_allocate_iso_resource)
  244. #define FW_CDEV_IOC_DEALLOCATE_ISO_RESOURCE      _IOW('#', 0x0e, struct fw_cdev_deallocate)
  245. #define FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE_ONCE   _IOW('#', 0x0f, struct fw_cdev_allocate_iso_resource)
  246. #define FW_CDEV_IOC_DEALLOCATE_ISO_RESOURCE_ONCE _IOW('#', 0x10, struct fw_cdev_allocate_iso_resource)
  247. #define FW_CDEV_IOC_GET_SPEED                     _IO('#', 0x11) /* returns speed code */
  248. #define FW_CDEV_IOC_SEND_BROADCAST_REQUEST       _IOW('#', 0x12, struct fw_cdev_send_request)
  249. #define FW_CDEV_IOC_SEND_STREAM_PACKET           _IOW('#', 0x13, struct fw_cdev_send_stream_packet)
  250.  
  251. /*
  252.  * FW_CDEV_VERSION History
  253.  *  1  (2.6.22)  - initial version
  254.  *  2  (2.6.30)  - changed &fw_cdev_event_iso_interrupt.header if
  255.  *                 &fw_cdev_create_iso_context.header_size is 8 or more
  256.  */
  257. #define FW_CDEV_VERSION 2
  258.  
  259. /**
  260.  * struct fw_cdev_get_info - General purpose information ioctl
  261.  * @version:    The version field is just a running serial number.
  262.  *        We never break backwards compatibility, but may add more
  263.  *        structs and ioctls in later revisions.
  264.  * @rom_length:    If @rom is non-zero, at most rom_length bytes of configuration
  265.  *        ROM will be copied into that user space address.  In either
  266.  *        case, @rom_length is updated with the actual length of the
  267.  *        configuration ROM.
  268.  * @rom:    If non-zero, address of a buffer to be filled by a copy of the
  269.  *        device's configuration ROM
  270.  * @bus_reset:    If non-zero, address of a buffer to be filled by a
  271.  *        &struct fw_cdev_event_bus_reset with the current state
  272.  *        of the bus.  This does not cause a bus reset to happen.
  273.  * @bus_reset_closure: Value of &closure in this and subsequent bus reset events
  274.  * @card:    The index of the card this device belongs to
  275.  */
  276. struct fw_cdev_get_info {
  277.     __u32 version;
  278.     __u32 rom_length;
  279.     __u64 rom;
  280.     __u64 bus_reset;
  281.     __u64 bus_reset_closure;
  282.     __u32 card;
  283. };
  284.  
  285. /**
  286.  * struct fw_cdev_send_request - Send an asynchronous request packet
  287.  * @tcode:    Transaction code of the request
  288.  * @length:    Length of outgoing payload, in bytes
  289.  * @offset:    48-bit offset at destination node
  290.  * @closure:    Passed back to userspace in the response event
  291.  * @data:    Userspace pointer to payload
  292.  * @generation:    The bus generation where packet is valid
  293.  *
  294.  * Send a request to the device.  This ioctl implements all outgoing requests.
  295.  * Both quadlet and block request specify the payload as a pointer to the data
  296.  * in the @data field.  Once the transaction completes, the kernel writes an
  297.  * &fw_cdev_event_response event back.  The @closure field is passed back to
  298.  * user space in the response event.
  299.  */
  300. struct fw_cdev_send_request {
  301.     __u32 tcode;
  302.     __u32 length;
  303.     __u64 offset;
  304.     __u64 closure;
  305.     __u64 data;
  306.     __u32 generation;
  307. };
  308.  
  309. /**
  310.  * struct fw_cdev_send_response - Send an asynchronous response packet
  311.  * @rcode:    Response code as determined by the userspace handler
  312.  * @length:    Length of outgoing payload, in bytes
  313.  * @data:    Userspace pointer to payload
  314.  * @handle:    The handle from the &fw_cdev_event_request
  315.  *
  316.  * Send a response to an incoming request.  By setting up an address range using
  317.  * the %FW_CDEV_IOC_ALLOCATE ioctl, userspace can listen for incoming requests.  An
  318.  * incoming request will generate an %FW_CDEV_EVENT_REQUEST, and userspace must
  319.  * send a reply using this ioctl.  The event has a handle to the kernel-side
  320.  * pending transaction, which should be used with this ioctl.
  321.  */
  322. struct fw_cdev_send_response {
  323.     __u32 rcode;
  324.     __u32 length;
  325.     __u64 data;
  326.     __u32 handle;
  327. };
  328.  
  329. /**
  330.  * struct fw_cdev_allocate - Allocate a CSR address range
  331.  * @offset:    Start offset of the address range
  332.  * @closure:    To be passed back to userspace in request events
  333.  * @length:    Length of the address range, in bytes
  334.  * @handle:    Handle to the allocation, written by the kernel
  335.  *
  336.  * Allocate an address range in the 48-bit address space on the local node
  337.  * (the controller).  This allows userspace to listen for requests with an
  338.  * offset within that address range.  When the kernel receives a request
  339.  * within the range, an &fw_cdev_event_request event will be written back.
  340.  * The @closure field is passed back to userspace in the response event.
  341.  * The @handle field is an out parameter, returning a handle to the allocated
  342.  * range to be used for later deallocation of the range.
  343.  */
  344. struct fw_cdev_allocate {
  345.     __u64 offset;
  346.     __u64 closure;
  347.     __u32 length;
  348.     __u32 handle;
  349. };
  350.  
  351. /**
  352.  * struct fw_cdev_deallocate - Free a CSR address range or isochronous resource
  353.  * @handle:    Handle to the address range or iso resource, as returned by the
  354.  *        kernel when the range or resource was allocated
  355.  */
  356. struct fw_cdev_deallocate {
  357.     __u32 handle;
  358. };
  359.  
  360. #define FW_CDEV_LONG_RESET    0
  361. #define FW_CDEV_SHORT_RESET    1
  362.  
  363. /**
  364.  * struct fw_cdev_initiate_bus_reset - Initiate a bus reset
  365.  * @type:    %FW_CDEV_SHORT_RESET or %FW_CDEV_LONG_RESET
  366.  *
  367.  * Initiate a bus reset for the bus this device is on.  The bus reset can be
  368.  * either the original (long) bus reset or the arbitrated (short) bus reset
  369.  * introduced in 1394a-2000.
  370.  */
  371. struct fw_cdev_initiate_bus_reset {
  372.     __u32 type;    /* FW_CDEV_SHORT_RESET or FW_CDEV_LONG_RESET */
  373. };
  374.  
  375. /**
  376.  * struct fw_cdev_add_descriptor - Add contents to the local node's config ROM
  377.  * @immediate:    If non-zero, immediate key to insert before pointer
  378.  * @key:    Upper 8 bits of root directory pointer
  379.  * @data:    Userspace pointer to contents of descriptor block
  380.  * @length:    Length of descriptor block data, in bytes
  381.  * @handle:    Handle to the descriptor, written by the kernel
  382.  *
  383.  * Add a descriptor block and optionally a preceding immediate key to the local
  384.  * node's configuration ROM.
  385.  *
  386.  * The @key field specifies the upper 8 bits of the descriptor root directory
  387.  * pointer and the @data and @length fields specify the contents. The @key
  388.  * should be of the form 0xXX000000. The offset part of the root directory entry
  389.  * will be filled in by the kernel.
  390.  *
  391.  * If not 0, the @immediate field specifies an immediate key which will be
  392.  * inserted before the root directory pointer.
  393.  *
  394.  * If successful, the kernel adds the descriptor and writes back a handle to the
  395.  * kernel-side object to be used for later removal of the descriptor block and
  396.  * immediate key.
  397.  *
  398.  * This ioctl affects the configuration ROMs of all local nodes.
  399.  * The ioctl only succeeds on device files which represent a local node.
  400.  */
  401. struct fw_cdev_add_descriptor {
  402.     __u32 immediate;
  403.     __u32 key;
  404.     __u64 data;
  405.     __u32 length;
  406.     __u32 handle;
  407. };
  408.  
  409. /**
  410.  * struct fw_cdev_remove_descriptor - Remove contents from the configuration ROM
  411.  * @handle:    Handle to the descriptor, as returned by the kernel when the
  412.  *        descriptor was added
  413.  *
  414.  * Remove a descriptor block and accompanying immediate key from the local
  415.  * nodes' configuration ROMs.
  416.  */
  417. struct fw_cdev_remove_descriptor {
  418.     __u32 handle;
  419. };
  420.  
  421. #define FW_CDEV_ISO_CONTEXT_TRANSMIT    0
  422. #define FW_CDEV_ISO_CONTEXT_RECEIVE    1
  423.  
  424. /**
  425.  * struct fw_cdev_create_iso_context - Create a context for isochronous IO
  426.  * @type:    %FW_CDEV_ISO_CONTEXT_TRANSMIT or %FW_CDEV_ISO_CONTEXT_RECEIVE
  427.  * @header_size: Header size to strip for receive contexts
  428.  * @channel:    Channel to bind to
  429.  * @speed:    Speed to transmit at
  430.  * @closure:    To be returned in &fw_cdev_event_iso_interrupt
  431.  * @handle:    Handle to context, written back by kernel
  432.  *
  433.  * Prior to sending or receiving isochronous I/O, a context must be created.
  434.  * The context records information about the transmit or receive configuration
  435.  * and typically maps to an underlying hardware resource.  A context is set up
  436.  * for either sending or receiving.  It is bound to a specific isochronous
  437.  * channel.
  438.  *
  439.  * If a context was successfully created, the kernel writes back a handle to the
  440.  * context, which must be passed in for subsequent operations on that context.
  441.  *
  442.  * Note that the effect of a @header_size > 4 depends on
  443.  * &fw_cdev_get_info.version, as documented at &fw_cdev_event_iso_interrupt.
  444.  */
  445. struct fw_cdev_create_iso_context {
  446.     __u32 type;
  447.     __u32 header_size;
  448.     __u32 channel;
  449.     __u32 speed;
  450.     __u64 closure;
  451.     __u32 handle;
  452. };
  453.  
  454. #define FW_CDEV_ISO_PAYLOAD_LENGTH(v)    (v)
  455. #define FW_CDEV_ISO_INTERRUPT        (1 << 16)
  456. #define FW_CDEV_ISO_SKIP        (1 << 17)
  457. #define FW_CDEV_ISO_SYNC        (1 << 17)
  458. #define FW_CDEV_ISO_TAG(v)        ((v) << 18)
  459. #define FW_CDEV_ISO_SY(v)        ((v) << 20)
  460. #define FW_CDEV_ISO_HEADER_LENGTH(v)    ((v) << 24)
  461.  
  462. /**
  463.  * struct fw_cdev_iso_packet - Isochronous packet
  464.  * @control:    Contains the header length (8 uppermost bits), the sy field
  465.  *        (4 bits), the tag field (2 bits), a sync flag (1 bit),
  466.  *        a skip flag (1 bit), an interrupt flag (1 bit), and the
  467.  *        payload length (16 lowermost bits)
  468.  * @header:    Header and payload
  469.  *
  470.  * &struct fw_cdev_iso_packet is used to describe isochronous packet queues.
  471.  *
  472.  * Use the FW_CDEV_ISO_ macros to fill in @control.  The sy and tag fields are
  473.  * specified by IEEE 1394a and IEC 61883.
  474.  *
  475.  * FIXME - finish this documentation
  476.  */
  477. struct fw_cdev_iso_packet {
  478.     __u32 control;
  479.     __u32 header[0];
  480. };
  481.  
  482. /**
  483.  * struct fw_cdev_queue_iso - Queue isochronous packets for I/O
  484.  * @packets:    Userspace pointer to packet data
  485.  * @data:    Pointer into mmap()'ed payload buffer
  486.  * @size:    Size of packet data in bytes
  487.  * @handle:    Isochronous context handle
  488.  *
  489.  * Queue a number of isochronous packets for reception or transmission.
  490.  * This ioctl takes a pointer to an array of &fw_cdev_iso_packet structs,
  491.  * which describe how to transmit from or receive into a contiguous region
  492.  * of a mmap()'ed payload buffer.  As part of the packet descriptors,
  493.  * a series of headers can be supplied, which will be prepended to the
  494.  * payload during DMA.
  495.  *
  496.  * The kernel may or may not queue all packets, but will write back updated
  497.  * values of the @packets, @data and @size fields, so the ioctl can be
  498.  * resubmitted easily.
  499.  */
  500. struct fw_cdev_queue_iso {
  501.     __u64 packets;
  502.     __u64 data;
  503.     __u32 size;
  504.     __u32 handle;
  505. };
  506.  
  507. #define FW_CDEV_ISO_CONTEXT_MATCH_TAG0         1
  508. #define FW_CDEV_ISO_CONTEXT_MATCH_TAG1         2
  509. #define FW_CDEV_ISO_CONTEXT_MATCH_TAG2         4
  510. #define FW_CDEV_ISO_CONTEXT_MATCH_TAG3         8
  511. #define FW_CDEV_ISO_CONTEXT_MATCH_ALL_TAGS    15
  512.  
  513. /**
  514.  * struct fw_cdev_start_iso - Start an isochronous transmission or reception
  515.  * @cycle:    Cycle in which to start I/O.  If @cycle is greater than or
  516.  *        equal to 0, the I/O will start on that cycle.
  517.  * @sync:    Determines the value to wait for for receive packets that have
  518.  *        the %FW_CDEV_ISO_SYNC bit set
  519.  * @tags:    Tag filter bit mask.  Only valid for isochronous reception.
  520.  *        Determines the tag values for which packets will be accepted.
  521.  *        Use FW_CDEV_ISO_CONTEXT_MATCH_ macros to set @tags.
  522.  * @handle:    Isochronous context handle within which to transmit or receive
  523.  */
  524. struct fw_cdev_start_iso {
  525.     __s32 cycle;
  526.     __u32 sync;
  527.     __u32 tags;
  528.     __u32 handle;
  529. };
  530.  
  531. /**
  532.  * struct fw_cdev_stop_iso - Stop an isochronous transmission or reception
  533.  * @handle:    Handle of isochronous context to stop
  534.  */
  535. struct fw_cdev_stop_iso {
  536.     __u32 handle;
  537. };
  538.  
  539. /**
  540.  * struct fw_cdev_get_cycle_timer - read cycle timer register
  541.  * @local_time:   system time, in microseconds since the Epoch
  542.  * @cycle_timer:  isochronous cycle timer, as per OHCI 1.1 clause 5.13
  543.  *
  544.  * The %FW_CDEV_IOC_GET_CYCLE_TIMER ioctl reads the isochronous cycle timer
  545.  * and also the system clock.  This allows to express the receive time of an
  546.  * isochronous packet as a system time with microsecond accuracy.
  547.  *
  548.  * @cycle_timer consists of 7 bits cycleSeconds, 13 bits cycleCount, and
  549.  * 12 bits cycleOffset, in host byte order.
  550.  */
  551. struct fw_cdev_get_cycle_timer {
  552.     __u64 local_time;
  553.     __u32 cycle_timer;
  554. };
  555.  
  556. /**
  557.  * struct fw_cdev_allocate_iso_resource - (De)allocate a channel or bandwidth
  558.  * @closure:    Passed back to userspace in correponding iso resource events
  559.  * @channels:    Isochronous channels of which one is to be (de)allocated
  560.  * @bandwidth:    Isochronous bandwidth units to be (de)allocated
  561.  * @handle:    Handle to the allocation, written by the kernel (only valid in
  562.  *        case of %FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE ioctls)
  563.  *
  564.  * The %FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE ioctl initiates allocation of an
  565.  * isochronous channel and/or of isochronous bandwidth at the isochronous
  566.  * resource manager (IRM).  Only one of the channels specified in @channels is
  567.  * allocated.  An %FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED is sent after
  568.  * communication with the IRM, indicating success or failure in the event data.
  569.  * The kernel will automatically reallocate the resources after bus resets.
  570.  * Should a reallocation fail, an %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED event
  571.  * will be sent.  The kernel will also automatically deallocate the resources
  572.  * when the file descriptor is closed.
  573.  *
  574.  * The %FW_CDEV_IOC_DEALLOCATE_ISO_RESOURCE ioctl can be used to initiate
  575.  * deallocation of resources which were allocated as described above.
  576.  * An %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED event concludes this operation.
  577.  *
  578.  * The %FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE_ONCE ioctl is a variant of allocation
  579.  * without automatic re- or deallocation.
  580.  * An %FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED event concludes this operation,
  581.  * indicating success or failure in its data.
  582.  *
  583.  * The %FW_CDEV_IOC_DEALLOCATE_ISO_RESOURCE_ONCE ioctl works like
  584.  * %FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE_ONCE except that resources are freed
  585.  * instead of allocated.
  586.  * An %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED event concludes this operation.
  587.  *
  588.  * To summarize, %FW_CDEV_IOC_DEALLOCATE_ISO_RESOURCE allocates iso resources
  589.  * for the lifetime of the fd or handle.
  590.  * In contrast, %FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE_ONCE allocates iso resources
  591.  * for the duration of a bus generation.
  592.  *
  593.  * @channels is a host-endian bitfield with the least significant bit
  594.  * representing channel 0 and the most significant bit representing channel 63:
  595.  * 1ULL << c for each channel c that is a candidate for (de)allocation.
  596.  *
  597.  * @bandwidth is expressed in bandwidth allocation units, i.e. the time to send
  598.  * one quadlet of data (payload or header data) at speed S1600.
  599.  */
  600. struct fw_cdev_allocate_iso_resource {
  601.     __u64 closure;
  602.     __u64 channels;
  603.     __u32 bandwidth;
  604.     __u32 handle;
  605. };
  606.  
  607. /**
  608.  * struct fw_cdev_send_stream_packet - send an asynchronous stream packet
  609.  * @length:    Length of outgoing payload, in bytes
  610.  * @tag:    Data format tag
  611.  * @channel:    Isochronous channel to transmit to
  612.  * @sy:        Synchronization code
  613.  * @closure:    Passed back to userspace in the response event
  614.  * @data:    Userspace pointer to payload
  615.  * @generation:    The bus generation where packet is valid
  616.  * @speed:    Speed to transmit at
  617.  *
  618.  * The %FW_CDEV_IOC_SEND_STREAM_PACKET ioctl sends an asynchronous stream packet
  619.  * to every device which is listening to the specified channel.  The kernel
  620.  * writes an &fw_cdev_event_response event which indicates success or failure of
  621.  * the transmission.
  622.  */
  623. struct fw_cdev_send_stream_packet {
  624.     __u32 length;
  625.     __u32 tag;
  626.     __u32 channel;
  627.     __u32 sy;
  628.     __u64 closure;
  629.     __u64 data;
  630.     __u32 generation;
  631.     __u32 speed;
  632. };
  633.  
  634. #endif /* _LINUX_FIREWIRE_CDEV_H */
  635.